using System;
using NUnit.Framework;
namespace Application {
	
	[TestFixture()]
	public class TestParking {
		
		[Test()]
		// Test de l'instanciation d'un parking
		public void TestInstanciation() {
			Acces acces = new Acces(1, new Borne(), new Teleporteur(), new Teleporteur(), new PanneauAffichage(), new Camera());
			Parking parking = new Parking(100, acces);
			Assert.AreEqual(parking.getNbPlacesMax, 100);
			
			Assert.NotNull(parking.listeAdherents);
			Assert.NotNull(parking.places);
			Assert.NotNull(parking.traces);
		}
		
		[Test()]
		// Test des méthodes de sérialization
		public void TestSauverChargerParking() {
			Acces acces = new Acces(1, new Borne(), new Teleporteur(), new Teleporteur(), new PanneauAffichage(), new Camera());
			Parking parking = new Parking(100, acces);
			
			parking.ajouterPlace(new Place(23, 2, 230, 230, false));
			parking.sauver("Sauvegarde_Test");
			
			Parking parking2 = Parking.charger("Sauvegarde_Test");
			Assert.AreEqual(parking, parking2);
		}
		
		[Test()]
		public void TestRechercherPlaceLibre() {
			Acces acces = new Acces(1, new Borne(), new Teleporteur(), new Teleporteur(), new PanneauAffichage(), new Camera());
			Parking parking = new Parking(3, acces);
			
			// On ajoute 3 places au parking dont une libre
			parking.ajouterPlace(new Place(1, 1, 230, 230, false));
			parking.ajouterPlace(new Place(2, 1, 230, 230, true));
			parking.ajouterPlace(new Place(3, 1, 230, 230, true));
			
			// La méthode doit donc nous retourner la place 1 qui est la seule libre.
			int placeLibre = parking.rechercherPlaceLibre();
			Assert.AreEqual(placeLibre, 1);
			
			// On supprime la seule place libre
			parking.supprimerPlace(1);
			placeLibre = parking.rechercherPlaceLibre();
			Assert.IsNull(placeLibre);	// La méthode doit renvoyer null
		}
	}
}
